home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Controls / Visual Basic Controls.iso / vbcontrol / sregexpf / regexp.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1998-06-02  |  4.3 KB  |  172 lines

  1. #include "stdafx.h"
  2. #include "sgRegExp.h"
  3. #include "RegExp.h"
  4.  
  5. #pragma warning(disable:4310) // cast truncates constant value
  6.  
  7. #define ERROR_BASE 0x80004000
  8.  
  9.  
  10. sgRegExp::sgRegExp()
  11. {
  12.     m_bCase  = false;
  13.     m_RegExp = 0;
  14. }
  15.  
  16. sgRegExp::~sgRegExp()
  17. {
  18.     delete m_RegExp;
  19. }
  20.  
  21.  
  22. //---------------------------------------------------------------------------------------
  23. // ISupportsErrorInfo interface
  24. //---------------------------------------------------------------------------------------
  25. STDMETHODIMP sgRegExp::InterfaceSupportsErrorInfo(REFIID riid)
  26. {
  27.     static const IID* arr[] = 
  28.     {
  29.         &IID_IsgRegExp,
  30.     };
  31.     for (int i=0;i<sizeof(arr)/sizeof(arr[0]);i++)
  32.     {
  33.         if (InlineIsEqualGUID(*arr[i],riid))
  34.             return S_OK;
  35.     }
  36.     return S_FALSE;
  37. }
  38.  
  39. //---------------------------------------------------------------------------------------
  40. // IsgRegExp interface
  41. //---------------------------------------------------------------------------------------
  42. STDMETHODIMP sgRegExp::put_Expression(/*[in]*/ BSTR expr)
  43. {
  44.     bstr_t bstr(expr, true);
  45.     m_sRegExpr = (LPCTSTR)bstr;
  46.  
  47.     delete m_RegExp;
  48.     m_RegExp = 0;
  49.     m_RegExp = new Regexp(m_sRegExpr.c_str(), m_bCase);
  50.  
  51.     if (m_RegExp == 0)
  52.         return E_OUTOFMEMORY;
  53.     else
  54.         return S_OK;
  55. }
  56.  
  57. STDMETHODIMP sgRegExp::get_Expression(/*[out, retval]*/ BSTR* expr)
  58. {
  59.     if (expr == 0)
  60.         return E_POINTER;
  61.  
  62.     bstr_t bstr(m_sRegExpr.c_str());
  63.     *expr = bstr.copy();
  64.     return S_OK;
  65. }
  66.  
  67. STDMETHODIMP sgRegExp::put_IgnoreCase(/*[in]*/ VARIANT_BOOL ignoreCase)
  68. {
  69.     m_bCase = (ignoreCase == VARIANT_TRUE) ? true : false;
  70.  
  71.     if (!m_sRegExpr.empty())
  72.     {
  73.         delete m_RegExp;
  74.         m_RegExp = 0;
  75.         m_RegExp = new Regexp(m_sRegExpr.c_str(), m_bCase);
  76.     }
  77.  
  78.     if (m_RegExp == 0)
  79.         return E_OUTOFMEMORY;
  80.     else
  81.         return S_OK;
  82. }
  83.  
  84. STDMETHODIMP sgRegExp::get_IgnoreCase(/*[out, retval]*/ VARIANT_BOOL* ignoreCase)
  85. {
  86.     if (ignoreCase == 0)
  87.         return E_POINTER;
  88.  
  89.     *ignoreCase = m_bCase ? VARIANT_TRUE : VARIANT_FALSE;
  90.     return S_OK;
  91. }
  92.  
  93. STDMETHODIMP sgRegExp::Match(/*[in]*/ BSTR data, /*[in, optional, defaultvalue(-1)]*/ VARIANT startPos, /*[out, retval]*/ VARIANT_BOOL* res)
  94. {
  95.     if (res == 0)
  96.         return E_POINTER;
  97.     if (m_RegExp == 0)
  98.         return AtlReportError(CLSID_RegExp, IDS_ERR_NOREGEXP, GUID_NULL, ERROR_BASE+IDS_ERR_NOREGEXP);
  99.  
  100.     *res = VARIANT_FALSE;
  101.  
  102.     bstr_t bstr(data, true);
  103.     m_sData = (LPCTSTR)bstr;
  104.  
  105.     // Get matching start position
  106.     long lStartPos = 0;
  107.     if (startPos.vt != VT_I4)
  108.     {
  109.         HRESULT hr = ::VariantChangeType(&startPos, &startPos, 0, VT_I4);
  110.         if (FAILED(hr))
  111.             return AtlReportError(CLSID_RegExp, IDS_ERR_INVALIDSTARTPOS, GUID_NULL, ERROR_BASE+IDS_ERR_NOREGEXP);
  112.     }
  113.     lStartPos = startPos.lVal-1;
  114.     if (lStartPos < 0)
  115.         lStartPos = 0;
  116.  
  117.     *res = m_RegExp->Match(m_sData.c_str(), lStartPos) ? VARIANT_TRUE : VARIANT_FALSE;
  118.     if (!m_RegExp->CompiledOK())
  119.         return AtlReportError(CLSID_RegExp, m_RegExp->GetErrorString().c_str(), GUID_NULL, ERROR_BASE + m_RegExp->GetErrorNumber());
  120.  
  121.     return S_OK;
  122. }
  123.  
  124. STDMETHODIMP sgRegExp::get_ReplaceString(/*[in]*/ BSTR source, /*[out, retval]*/ BSTR* res)
  125. {
  126.     if (res == 0)
  127.         return E_POINTER;
  128.     if (m_RegExp == 0)
  129.         return AtlReportError(CLSID_RegExp, IDS_ERR_NOREGEXP, GUID_NULL, ERROR_BASE+IDS_ERR_NOREGEXP);
  130.  
  131.     bstr_t bstr(source, true);
  132.     str_t sSource = (LPCTSTR)bstr;
  133.  
  134.     bstr_t bstrRes(m_RegExp->GetReplaceString(sSource.c_str()).c_str());
  135.     *res = bstrRes.copy();
  136.  
  137.     return S_OK;
  138. }
  139.  
  140. STDMETHODIMP sgRegExp::get_CompiledOK(/*[out, retval]*/ VARIANT_BOOL* res)
  141. {
  142.     if (res == 0)
  143.         return E_POINTER;
  144.     if (m_RegExp == 0)
  145.         return AtlReportError(CLSID_RegExp, IDS_ERR_NOREGEXP, GUID_NULL, ERROR_BASE+IDS_ERR_NOREGEXP);
  146.  
  147.     *res = m_RegExp->CompiledOK() ? VARIANT_TRUE : VARIANT_FALSE;
  148.     return S_OK;
  149. }
  150.  
  151. STDMETHODIMP sgRegExp::get_Substrings(/*[out, retval]*/ ISubstrings** res)
  152. {
  153.     if (res == 0)
  154.         return E_POINTER;
  155.     if (m_RegExp == 0)
  156.         return AtlReportError(CLSID_RegExp, IDS_ERR_NOREGEXP, GUID_NULL, ERROR_BASE+IDS_ERR_NOREGEXP);
  157.  
  158.     CComObject<Substrings>* subs;
  159.     HRESULT hr = CComObject<Substrings>::CreateInstance(&subs);
  160.     if(FAILED(hr))
  161.         return AtlReportError(CLSID_RegExp, IDS_ERR_SUBSTRINGS_FAILED, GUID_NULL, hr);
  162.     subs->AddRef();
  163.     hr = subs->Init(*m_RegExp);
  164.     if(FAILED(hr))
  165.         return AtlReportError(CLSID_RegExp, IDS_ERR_SUBSTRINGS_FAILED, GUID_NULL, hr);
  166.  
  167.     *res = subs;
  168.     return S_OK;
  169. }
  170.  
  171.  
  172.